﻿























using Spire.Pdf;
using Spire.Pdf.Graphics;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;

namespace Project_Proto
{
    public enum Konferenztypen
    {
        GruppenKonverenz,
        Zeugniskonferenz,
    }
  public class ProtokollToPdf
    { 
        float Seitengröße;
        int startZeile = 12;
       
        PdfDocument PDF = new PdfDocument();
        PdfPageBase Seite;
        /// <summary>
        /// Erstellt das Pdf Dokument und öffnet das Pdf Dokument nachdem es gespeichert wurde
        /// </summary>
      /// <param name="Bericht">Beinhaltet den zu Protokolierenden Inhalt</param>
      /// <param name="Pfad">Dateipfad+Dateiname.pdf an dem das Dokument gespeichert wird</param>
        public ProtokollToPdf(BerichtObjekt Bericht, string Pfad)
        {
            Arbeite(Bericht.titel, Bericht.datum, Bericht.anwesend, Bericht.externe, Bericht.protokollant, Bericht.moderator, Bericht.toObjList, Pfad);
        }
        private void Arbeite (string Typ, DateTime Datum, string[] AnwesendeLehrer, string[] externe,string Protokollant, string Moderrator, List<TagesordnungspunktObjekt> Protokoll, string Pfad)
        {
            float Schriftgroeße = 14f;
            int Zeilenabstand = (int)Schriftgroeße;
            CheckInput(ref  Typ, ref AnwesendeLehrer, ref  externe, ref  Protokollant, ref  Moderrator);
            PdfMargins margin = GetMargin();
            Seite = PDF.Pages.Add(PdfPageSize.A4,margin);
            Seitengröße = Seite.Size.Height-margin.Bottom-margin.Top;
            startZeile = Zeilenabstand;
            DrawText(PdfBrushes.Black, Schriftgroeße+6f, "Time New Roman", PdfTextAlignment.Left, 1.5f, FontStyle.Bold,ref Seite,Typ.ToString()+" Protokoll von "+Datum.Day+"."+Datum.Month+"."+Datum.Year,0,startZeile);
            startZeile += Zeilenabstand+6;
            DrawText(PdfBrushes.Black, Schriftgroeße+3f, "Time New Roman", PdfTextAlignment.Left, 1.5f, FontStyle.Bold, ref Seite,  " Anwesende Lehrer:", 0, startZeile);
            startZeile += Zeilenabstand+3;

            string anwesend = string.Empty;
            foreach (var item in AnwesendeLehrer)
            {
                anwesend += item + ", ";
            }
           foreach (var item in ZeilenErstellung(anwesend,Schriftgroeße))
	{
                DrawText(PdfBrushes.Black, Schriftgroeße, "Time New Roman", PdfTextAlignment.Left, 1.5f, FontStyle.Regular, ref Seite, item, 0, startZeile);
                startZeile += Zeilenabstand;		 
	}
               
                 startZeile += Zeilenabstand*3;
             DrawText(PdfBrushes.Black, Schriftgroeße+3f, "Time New Roman", PdfTextAlignment.Left, 1.5f, FontStyle.Bold, ref Seite,  " Externe:", 0, startZeile);
                startZeile += Zeilenabstand+3;		 
            string externePersonen = string.Empty;
            foreach (var item in externe)
            {
                externePersonen += item + ", ";
            }
           foreach (var item in ZeilenErstellung(externePersonen,Schriftgroeße))
	{
                DrawText(PdfBrushes.Black, Schriftgroeße, "Time New Roman", PdfTextAlignment.Left, 1.5f, FontStyle.Regular, ref Seite, item, 0, startZeile);
                startZeile += Zeilenabstand;		 
	}
            startZeile += Zeilenabstand*3;
                DrawText(PdfBrushes.Black, Schriftgroeße, "Time New Roman", PdfTextAlignment.Left, 1.5f, FontStyle.Bold, ref Seite, "Moderrator: " + Moderrator, 0, startZeile);
                DrawText(PdfBrushes.Black, Schriftgroeße, "Time New Roman", PdfTextAlignment.Left, 1.5f, FontStyle.Bold, ref Seite, "Protokollant: " + Protokollant, (int)Math.Round((Seite.Size.Width - (margin.Left + margin.Right)) / 2, 0), startZeile);
                startZeile += Zeilenabstand * 2;
                DrawText(PdfBrushes.Black, Schriftgroeße+3f, "Time New Roman", PdfTextAlignment.Left, 1.5f, FontStyle.Bold, ref Seite, "Tagesordnungspunkte " , 0, startZeile);
                startZeile += Zeilenabstand+3+Zeilenabstand;
                foreach (TagesordnungspunktObjekt topic in Protokoll)
                {
                  DrawText(PdfBrushes.Black, Schriftgroeße, "Time New Roman", PdfTextAlignment.Left, 1.5f, FontStyle.Bold, ref Seite, "Top "+topic.nummer+": "+topic.bezeichnung, 0, startZeile);
                  startZeile += Zeilenabstand;
                }
                startZeile += Zeilenabstand * 2;
                DrawText(PdfBrushes.Black, Schriftgroeße+3f, "Time New Roman", PdfTextAlignment.Left, 1.5f, FontStyle.Bold, ref Seite, "Protokoll:", 0, startZeile);
                startZeile += Zeilenabstand + 3;
                foreach (TagesordnungspunktObjekt topic in Protokoll)
                {
                    DrawText(PdfBrushes.Black, Schriftgroeße + 3f, "Time New Roman", PdfTextAlignment.Left, 1.5f, FontStyle.Bold, ref Seite, "Top "+topic.nummer+": "+topic.bezeichnung, 0, startZeile);
                    startZeile += (Zeilenabstand + 3)*3/2;
                    if (ZeilenErstellung(topic.protokoll, Schriftgroeße - 2f).Count!=0)
                    {
                        foreach (var zeile in ZeilenErstellung(topic.protokoll, Schriftgroeße - 2f))
                        {
                            DrawText(PdfBrushes.Black, Schriftgroeße - 2f, "Time New Roman", PdfTextAlignment.Left, 1.5f, FontStyle.Regular, ref Seite, zeile, 0, startZeile);
                            startZeile += Zeilenabstand - 2;

                        }
                    }
                    else
                    {
                        DrawText(PdfBrushes.Black, Schriftgroeße - 2f, "Time New Roman", PdfTextAlignment.Left, 1.5f, FontStyle.Regular, ref Seite, topic.protokoll, 0, startZeile);
                        startZeile += Zeilenabstand - 2;
                    }
                    startZeile += Zeilenabstand;
                  DrawText(PdfBrushes.Black, Schriftgroeße +3f, "Time New Roman", PdfTextAlignment.Left, 1.5f, FontStyle.Bold, ref Seite, "Beschluss:", 0, startZeile);
                  startZeile += (Zeilenabstand + 3) * 3/2;
                  if (ZeilenErstellung(topic.beschluss, Schriftgroeße - 2f).Count != 0)
                  {
                      foreach (var zeile in ZeilenErstellung(topic.beschluss, Schriftgroeße - 2f))
                      {
                          DrawText(PdfBrushes.Black, Schriftgroeße - 2f, "Time New Roman", PdfTextAlignment.Left, 1.5f, FontStyle.Regular, ref Seite, zeile, 0, startZeile);
                          startZeile += Zeilenabstand - 2;

                      }
                  }
                  else
                  {
                      DrawText(PdfBrushes.Black, Schriftgroeße - 2f, "Time New Roman", PdfTextAlignment.Left, 1.5f, FontStyle.Regular, ref Seite, topic.beschluss, 0, startZeile);
                      startZeile += Zeilenabstand - 2;
                  }
                  startZeile += Zeilenabstand;
                }
                try
                {
                     PDF.SaveToFile(Pfad);
            PDF.Close();
            System.Diagnostics.Process.Start(Pfad);
                }
                catch (IOException )
                {
                   
                    System.Windows.Forms.MessageBox.Show("Konnte Protokoll nicht speichern da das PDF bereits geöffnet ist.\n Bitte Schließen sie das Pdf und versuchen sie es erneut.","Fehler beim Speichern",System.Windows.Forms.MessageBoxButtons.OK,System.Windows.Forms.MessageBoxIcon.Error);
                }    
           


        }

        private static PdfMargins GetMargin()
        {
            PdfUnitConvertor unitCvtr = new PdfUnitConvertor();
            PdfMargins margin = new PdfMargins();
            margin.Top = 30f;// unitCvtr.ConvertUnits(2.1f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point);
            margin.Bottom = margin.Top;
            margin.Left = 25f; //unitCvtr.ConvertUnits(1.5f, PdfGraphicsUnit.Centimeter, PdfGraphicsUnit.Point);
            margin.Right = margin.Left;
            return margin;
        }
        private bool DrawText (PdfBrush textolour, float TextSize,string Schriftart, PdfTextAlignment TextAusrischtung,float Zeilenabstand,FontStyle Style, ref  PdfPageBase Seite, string Text, int x, int y)
        {
            PdfStringFormat format = new PdfStringFormat(TextAusrischtung);
            PdfTrueTypeFont font = new PdfTrueTypeFont(new Font(Schriftart, TextSize,Style));
            format.LineSpacing = font.Size * Zeilenabstand;
            if (SeiteVoll( (int)TextSize))
            {
                y = startZeile; 
            }
            if (Text == null || Text == string.Empty)
            {
                Text = " ";
            }
            Seite.Canvas.DrawString(Text, font, textolour, x,y, format);

                return true;
        }

        private bool SeiteVoll(int TextSize)
        {
            if ((startZeile+TextSize)>Seitengröße)
            {
                PdfMargins margin = GetMargin();
                Seite = PDF.Pages.Add(PdfPageSize.A4, margin);
                startZeile = 0;
                return true;
            }
            return false;
        }
        private List<string> ZeilenErstellung(string Text, float Schriftgoesse)
        {
            if (Text != null & Text != string.Empty)
            {
                int maxAnzahlZeilenZeichen = (int)(Seite.Size.Width / (Schriftgoesse / 2.1f));
                var cache = Text.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
                int wort = 0;
                int anzahlzeichenZeile = 0;
                string zeile = string.Empty;
                List<string> Zeilen = new List<string>();
                do
                {
                    if (cache.Length != 0)
                    {
                        char[] wortcahce = cache[wort].ToCharArray();
                        if ((anzahlzeichenZeile + wortcahce.GetUpperBound(0)) + 1 > maxAnzahlZeilenZeichen)
                        {
                            Zeilen.Add(zeile);
                            zeile = string.Empty;
                            anzahlzeichenZeile = 0;
                        }
                        else
                        {
                            zeile += cache[wort] + " ";
                            anzahlzeichenZeile += (wortcahce.Length + 1);
                            wort++;
                        }
                    }
                    else
                    {
                        wort = cache.GetUpperBound(0) + 1;
                    }
                } while (wort <= cache.GetUpperBound(0));
                if (zeile != string.Empty)
                {
                    Zeilen.Add(zeile);
                } 
                return Zeilen;
            }
            else
            {
                return new List<string>();
            }

           
           
        }
        private void CheckInput(ref string Typ, ref string[] AnwesendeLehrer, ref string[] externe, ref string Protokollant, ref string Moderrator)
        {
            if (Typ == null || Typ == string.Empty)
            {
                Typ = "Kein KonferenzTyp vorhanden";
            }
            if (AnwesendeLehrer == null || AnwesendeLehrer.Length == 0)
            {
                string[] x = new string[1] { "Keine Lehrer anwesend" };
                AnwesendeLehrer = x;
            }
            if (externe == null || externe.Length == 0)
            {
                string[] x = new string[1] { "Keine Externe anwesend" };
                externe = x;
            }
            if (Protokollant == null || Protokollant == string.Empty)
            {
                Protokollant = "Kein Protokollant";
            }
            if (Moderrator == null || Moderrator == string.Empty)
            {
                Moderrator = "Kein Moderrator";
            }
        }
    }
}
